package com.abel.bigwater.dataserver.model.ewide

import com.abel.bigwater.data.BcdString
import io.netty.buffer.ByteBuf

/**
 * 终端编码是为每一个抄表下位机设备分配一个 5 个字节的下位机设备地址， 用以区分上传的数据源端
或目的端， 前 4 个字节是厂商自定义的序号， 各个设备制造商有权对自己生产的产品进行编号(以递增方式)。
最后一字节是厂商编号， 由地址管理机构分配给各个设备制造商。 前面 4 个字节按照低位在前， 高位在后
的方式处理：
例如： 10 00 00 00 03 (16 进制) 表示易维， 序号编号为 16 的终端
 */
class TermCodeType : TermData(KmingDataType.TermDummy, 5) {
    var manuId: BcdString? = null

    /**
     * 前 4 个字节是厂商自定义的序号
     */
    var codeBcd: BcdString? = null

    var fmt: String? = null
        get() = "${manuId!!.reversedBcdString()}${codeBcd!!.reversedBcdString()}".takeLast(10)

    override fun bufLength() = 5

    override fun parseBuf(buf: ByteBuf): Boolean {
        codeBcd = BcdString.create(buf, 4)
        manuId = BcdString.create(buf, 1)

        return true
    }

    override fun pack(buf: ByteBuf) {
        assert(codeBcd?.size == 4)
        assert(manuId!!.size == 1)

        buf.alloc().buffer().apply {
            writeBytes(codeBcd!!.hexArray)
            writeBytes(manuId!!.hexArray)

            buf.writeBytes(this)
        }
    }

    override fun equals(other: Any?): Boolean {
        if (other !is TermCodeType) return false

        if (other.codeBcd?.size != codeBcd?.size
                || other.manuId?.size != manuId?.size) return false
        for (i in 0 until codeBcd!!.size) {
            if (codeBcd!!.hexArray!![i] != other.codeBcd!!.hexArray!![i]) return false
        }
        for (i in 0 until manuId!!.size) {
            if (manuId!!.hexArray!![i] != other.manuId!!.hexArray!![i]) return false
        }

        return true
    }
}